#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<vector>
#include<errno.h>
#include<string.h>
#include<cstdio>
#include<stdlib.h>
#include<functional>
#include"task.h"
using namespace std;


typedef function<void()> task_t;

void LoadTask(vector<task_t>& tasks)
{
  tasks.push_back(PrintLog);
  tasks.push_back(DownLoad);
  tasks.push_back(Backup);
}


int main()
{
//     while(true)
//     {
//       printf("I am a process , pid:%d\n",getpid());
//       sleep(1);
//     }
  

 // char* p = nullptr;
 // *p = 'a';

  vector<task_t> tasks;
  LoadTask(tasks);

  pid_t id = fork();
  if(id == 0)
  {
    //child
    while(true)
    {
      printf("我是子进程，pid:%d\n",getpid());
      sleep(1);
    }
    exit(0);
  }
  //father
  while(true)
  {
    sleep(1);
    pid_t rid = waitpid(id,nullptr,WNOHANG);
   if(rid > 0)
   {
     printf("等待子进程%d成功\n",rid);
     break;
   }
   else if(rid < 0)
   {
     printf("等待子进程失败\n");
     break;
   }
   else 
   {
     for(auto& task : tasks )
     {
       task();
     }
   }

  }
  
  
  //  if(id <  0)
//  {
//      cout << "errno : " << errno<<", errstring: " << strerror(errno) << endl; 
//      return errno;
//  }
//  else if(id == 0) //child
//  {
//   // char* p = nullptr;
//   // *p = 'a';
//    int cnt = 5;
//    while(cnt--)
//    {
//      printf("子进程运行中... pid:%d\n",getpid());
//      sleep(1); 
//    }
//   exit(12);
//  }
//  else
//  {
//    sleep(10);
//    int status = 0;
//    pid_t rid = waitpid(id,&status,0);
//    if(rid > 0 )
//    {
//      if(WIFEXITED(status))
//       printf("wait sub process success,rid:%d , exit code:%d\n",rid,WEXITSTATUS(status));
//      else 
//       cout << "wait fail" <<endl;
//    //   printf("wait sub process success,rid:%d , exit code:%d, exit signal:%d\n",rid,WEXITSTATUS(status),WIFEXITED(status));
//    }
//    while(true)
//    {
//      printf("我是父进程,pid:%d\n",getpid());
//      sleep(1);
//    }
//  }

return 0;
}
